package cn.com.zero.base.config;

import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;

import java.util.Map;

/**
 * @author zhoupeng
 * @version 1.0.0
 * @Description 返回码配置类，默认引入 returncode.yaml 作为返回码表
 * @createTime 2022-07-11 14:40:29
 */
@Configuration
@ConfigurationProperties(prefix = "returncode")
public class ReturnCodeConfig {

    /**
     * 默认语言标识
     */
    @Value("${zero.language:zh-CN}")
    private String defaultLang;

    /**
     * 返回码表
     */
    private Map<String, String> root;


    /**
     * 获取返回码表
     *
     * @return 返回码表
     */
    public Map<String, String> getRoot() {
        return root;
    }

    /**
     * 设置返回码表
     *
     * @param root 返回码表
     */
    public void setRoot(Map<String, String> root) {
        this.root = root;
    }

    /**
     * 获取默认语言标识
     *
     * @return 语言标识
     */
    public String getDefaultLang() {
        return defaultLang;
    }

    /**
     * 获取默认消息，当没有找到特定返回码对应消息时返回默认消息
     *
     * @param code 返回码
     * @param lang 语言标识
     * @return 默认消息
     */
    public String getDefaultMessage(@NonNull String code, @Nullable String lang) {
        return "";
    }

    /**
     * 获取返回码对应默认语言消息
     *
     * @param code 返回码
     * @param args 格式化参数
     * @return 默认语言的返回消息
     */
    public String getMessage(@NonNull String code, String[] args) {
        return getMessage(code, args, getDefaultLang());
    }

    /**
     * 获取返回码对应语言的消息
     *
     * @param code 返回码
     * @param args 格式化参数
     * @param lang 语言标识
     * @return 返回消息
     */
    public String getMessage(@NonNull String code, String[] args, @Nullable String lang) {
        String message = "";
        if (root == null) {
            // TODO 修改为统一日志输出
            System.out.println("未找到返回码配置");
        } else {
            // 如果传入语言标识为空则使用默认标识
            String langKey = String.format("%s.%s", code, StrUtil.emptyToDefault(lang, getDefaultLang()));

            // 获取对应语言消息
            message = root.get(langKey);

            // 如果消息为空，则尝试用返回码直接获取
            if (message == null) {
                message = root.get(code);
            }

            // 根据参数格式化
            if (message != null && args != null && args.length > 0) {
                message = String.format(message, (Object[]) args);
            }
        }
        return StrUtil.emptyToDefault(message, getDefaultMessage(code, lang));
    }


}